//
// Created by ct on 2020/10/10.
//

#ifndef HTTPSERVER_SERVER_H
#define HTTPSERVER_SERVER_H
#include <boost/asio.hpp>
#include <string>
#include "connection.h"
#include "connection_manager.h"
#include "request_handler.h"
/// HTTP服务器的顶级类。
namespace http {
    namespace server {
    class server {
    private:
        /// 执行异步接受操作。
        void do_accept();

        /// 等待停止服务器的请求。
        void do_await_stop();

        /// 用于执行异步操作的io_上下文。
        boost::asio::io_context io_context_;

        /// signal_set用于注册进程终止通知。
        boost::asio::signal_set signals_;

        /// 用于侦听传入连接的接收器。
        boost::asio::ip::tcp::acceptor acceptor_;

        /// 拥有所有活动连接的连接管理器。
        connection_manager connection_manager_;

        /// 所有传入请求的处理程序。
        request_handler request_handler_;
    public:
        server(const server&)=delete;
        server& operator=(const  server&) = delete;
        /// 构造服务器以侦听指定的TCP地址和端口，并且
        /// 提供给定目录中的文件。
        explicit server(const std::string& address, const std::string& port,
                        const std::string& doc_root);
        /// 运行服务器的io_上下文循环。
        void run();
    };
    } // namespace http
} // namespace server
#endif //HTTPSERVER_SERVER_H
